home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ML_3DROT.ZIP / SOURCES / ENGINE3D.PAS < prev    next >
Pascal/Delphi Source File  |  1996-05-04  |  5KB  |  162 lines

  1. Unit Engine3d;
  2. {
  3.   3D Engine, v3.01
  4.   by Maple Leaf, 1996
  5.   No fuckin rights reserved.
  6.   last update: 4th May 1996
  7. }
  8.  
  9. Interface
  10.  
  11. Const
  12.   Perspective   : Boolean = True;  { Default with perspective }
  13.   ZoomFactor    : LongInt = 220;   { Zooming 220% as default  }
  14.   PiOver180     : Real    = Pi/180;
  15.   CenterX       : LongInt = 160;   { Center's coordinates     }
  16.   CenterY       : LongInt = 100;
  17.   ObserverX     : LongInt = 0;     { Defaults. See procedure SetObserver.. }
  18.   ObserverY     : LongInt = 0;
  19.   ObserverDist  : LongInt = 300;   { Initial focus }
  20.   CameraX       : Longint = 0;     { Initial camera coords in 3D space }
  21.   CameraY       : Longint = 0;
  22.   CameraZ       : Longint = 0;
  23.  
  24. Var
  25.   _3DX          : LongInt;         {-----------}
  26.   _3DY          : LongInt;         { 3D coords }
  27.   _3DZ          : LongInt;         {-----------}
  28.   _2DX          : LongInt;         { 2D X      }
  29.   _2DY          : LongInt;         { 2D Y      }
  30.   { ---- Angles ---- }
  31.   RotAngle, TiltAngle       : Integer;
  32.   CosA, CosB, SinA, SinB    : Real;
  33.   CosTab, SinTab            : Array [0..359] of LongInt; { Integer(cosinus|sinus*256) }
  34.   Xt, Yt, Zt, TmpEqu : LongInt;
  35.  
  36. Procedure SetCenter (x,y:Integer);
  37. { Sets the center of the screen }
  38. Procedure SetAngles (Rotation,Tilt:Integer);
  39. { Sets the angles (horizontal rotation and tilt) }
  40. Procedure SetObserverPosition (x,y:LongInt; Focus:LongInt);
  41. { Sets the focus of the camera (e.g. the distance between the
  42.   observer and the projection plane), and the 2D position (X,Y)
  43.   of the observer in a plane parallel w/ the projection plane. }
  44. Procedure SetCamera (x,y,z:Longint);
  45. { Sets the (X,Y,Z) position of the camera in the virtual 3D space }
  46. { Or else: (X,Y,Z) will be the only point which has a FIXED position
  47.   onto the 2D desktop (e.g. screen), for any rotations }
  48. Procedure MapCoordinates;
  49. { Default Floating-Point mapping routine. Translates a 3D point into a 2D one. }
  50. Procedure IntMapCoordinates;
  51. { Default integer-mapping routine. Translates a 3D point into a 2D one. }
  52. Procedure IntMapCoordinates2;
  53. { Second integer-mapping routine. Uses ZoomFactor=256=constant, for speed. }
  54. Procedure IncrAngle (var Angle:Integer; value:integer);
  55. { Increment or decrement the specified angle w/ a specified
  56.   value, taking care of translating the result in the interval [0-359] }
  57.  
  58. Implementation
  59. {$L engine3d}
  60.  
  61. Procedure IntMapCoordinates;external;
  62. Procedure IntMapCoordinates2;external;
  63.  
  64. Procedure SetCenter(x,y:Integer);assembler;
  65. asm
  66.   mov ax,x
  67.   db 66h; cbw
  68.   db 66h; mov word ptr CenterX,ax  { Screen center (X coordinate) }
  69.   mov ax,y
  70.   db 66h; cbw
  71.   db 66h; mov word ptr CenterY,ax  { Screen center (Y coordinate) }
  72. end;
  73.  
  74. Procedure SetAngles(Rotation,Tilt:Integer);
  75. begin
  76.   RotAngle:=Rotation;
  77.   TiltAngle:=Tilt;
  78.   IncrAngle(RotAngle,0);
  79.   IncrAngle(TiltAngle,0);
  80. end;
  81.  
  82. Procedure SetObserverPosition(x,y:LongInt; Focus:LongInt);assembler;
  83. asm
  84.   db 66h; mov ax,word ptr x
  85.   db 66h; neg ax
  86.   db 66h; mov word ptr ObserverX,ax     { Observer's X position }
  87.   db 66h; mov ax,word ptr y
  88.   db 66h; neg ax
  89.   db 66h; mov word ptr ObserverY,ax     { Observer's Y position }
  90.   db 66h; mov ax,word ptr Focus
  91.   db 66h; mov word ptr ObserverDist,ax  { Distance from the observer to the projection plane (z=0) }
  92. end;
  93.  
  94. Procedure MapCoordinates;
  95. var Xt,Yt,Zt  : Real;
  96.     OneOverZt : Real;
  97. begin
  98.   { Init some vars, for speed }
  99.   CosA:=Cos( RotAngle * PiOver180 );
  100.   SinA:=Sin( RotAngle * PiOver180 );
  101.   CosB:=Cos( TiltAngle* PiOver180 );
  102.   SinB:=Sin( TiltAngle* PiOver180 );
  103.   { Init camera (bring it to the virtual screen's center) }
  104.   _3dx:=_3dx-CameraX;
  105.   _3dy:=_3dy-CameraY;
  106.   _3dz:=_3dz-CameraZ;
  107.   { Calculations }
  108.   Xt:= ObserverX + _3DX*CosA - _3DY*SinA;
  109.   Yt:= ObserverY + (_3DX*SinA+_3DY*CosA)*SinB + _3DZ*CosB;
  110.   if Perspective then begin
  111.     Zt:= ObserverDist + (_3DX*SinA+_3DY*CosA)*CosB - _3DZ*SinB;
  112.     _2DX:=CenterX+Trunc(Xt*ZoomFactor/Zt);
  113.     _2DY:=CenterY-Trunc(Yt*ZoomFactor/Zt*13/16);
  114.   end else begin
  115.     _2DX:=CenterX+Trunc(Xt);        { Faster, but less precise in aspect - no running points }
  116.     _2DY:=CenterY-Trunc(Yt*13/16);  { Faster, but less precise in aspect }
  117.   end;
  118. end;
  119.  
  120. Procedure IncrAngle(var Angle:Integer; value:integer);assembler;
  121. asm
  122.   les di,Angle
  123.   mov ax,value
  124.   mov cx,es:[di]
  125.   add cx,ax
  126.   or cx,cx
  127.   jl @Under
  128.   cmp cx,359
  129.   jg @Above
  130.   mov es:[di],cx
  131.   jmp @Ok
  132. @Above:
  133.   sub cx,360
  134.   mov es:[di],cx
  135.   jmp @Ok
  136. @Under:
  137.   mov ax,360
  138.   add ax,cx
  139.   mov es:[di],ax
  140. @Ok:
  141. end;
  142.  
  143. Procedure SetCamera(x,y,z:longint);assembler;
  144. asm
  145.   db 66h; mov ax,word ptr x
  146.   db 66h; mov word ptr CameraX,ax
  147.   db 66h; mov ax,word ptr y
  148.   db 66h; mov word ptr CameraY,ax
  149.   db 66h; mov ax,word ptr z
  150.   db 66h; mov word ptr CameraZ,ax
  151. end;
  152.  
  153. var k:word;
  154.  
  155. Begin
  156.   { Constructing default COS and SIN tables ... }
  157.   for k:=0 to 359 do begin
  158.     CosTab[k]:=LongInt(Trunc(cos(k*pi/180)*256));
  159.     SinTab[k]:=LongInt(Trunc(sin(k*pi/180)*256));
  160.   end;
  161. End.
  162.